﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Word=Microsoft.Office.Interop.Word;

namespace MyWordAddIn
{
    /// <summary>
    ///  //先要理解什么是Range，翻译为中文就是范围，可以理解为一段连续的区域 ，（图）。一个空行可以为一个Range，两行可以为一个Range，整篇文档从开头到结尾可以理解为一个Range。
    //常用方法Select 选择当前范围
    //常用属性Text 返回或设置当前范围的文字
    //什么对象可以返回Range呢 ，这个不少比如段落对象可以返回Range r.Paragraphs.First.Range, 范围的字符集和,如：r.Characters[1]；app.Selection属性也可以返回Range
    /// </summary>
    public class WordRange
    {
        Word.Document doc;
        public WordRange(Word.Document doc)
        {
            this.doc = doc;
        }

        public void GetAllRange(Message msg)
        {
            Word.Range r = doc.Range(doc.Paragraphs.First.Range.Start, doc.Paragraphs.Last.Range.End).Duplicate;//Duplicate: MSDN:通过复制 Range 对象，可以更改重复范围的起始字符位置或结束字符位置，而无需更改原始区域。
            msg.AddMsg(r);
        }

        public void GetHyperRange(Message msg)
        {
            Word.Range r = doc.Range(doc.Paragraphs.First.Range.Start, doc.Paragraphs.Last.Range.End);
            foreach (Word.Hyperlink hyperlink in r.Hyperlinks)
            {
                msg.AddMsg("Name", hyperlink.Name);
                msg.AddMsg("TextToDisplay", hyperlink.TextToDisplay);
                msg.AddMsg("Address", hyperlink.Address);
            }
        }

        public void InsertAfter(Message msg,string text)
        {
            Word.Range r = doc.Range(doc.Paragraphs.First.Range.Start, doc.Paragraphs.Last.Range.End).Duplicate;
            r.InsertAfter(text); //该方法在Range.End 处添加文字
        }

        public void InsertParagraphAfter(Message msg)
        {
            Word.Range r = doc.Range(doc.Paragraphs.First.Range.Start, doc.Paragraphs.Last.Range.End).Duplicate;
            r.InsertParagraphAfter();//该方法在Range.End 处添加一个新的段落 注意：会沿用上一段落的样式
        }

        public void InsertParagraphBefore(Message msg)
        {
            Word.Range r = doc.Range(doc.Paragraphs.First.Range.Start, doc.Paragraphs.Last.Range.End).Duplicate;
            r.InsertParagraphBefore();//该方法在Range.Start之前插入一个段落
        }

        public void InsertParagraph(Message msg)
        {
            Word.Range r = doc.Range(doc.Paragraphs.First.Range.Start, doc.Paragraphs.Last.Range.End).Duplicate;
            r.InsertParagraph();//把当前Range的内容全部删除，之后再插入一个段落，这就相当于有两个段落
        }

        public void DelParagraph(Message msg)
        {
            Word.Range r = doc.Range(doc.Paragraphs.First.Range.Start, doc.Paragraphs.Last.Range.End).Duplicate;
            r.Delete(); //删除方法是删除的这段范围的所有内容
        }
    }
}
